package com.datasecops.scannerservices.extractwatermark;

import com.datasecops.scannerservices.configurationfiles.WatermarkingConfiguration;
import com.datasecops.scannerservices.watermark.JNILinuxSo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**mysql数据库溯源
 * @author: GeXiaoLong
 * @time: 2023/2/13 19:47
 */
@Service
@Slf4j
public class MysqlExtract {
    @Resource
    private ExtractWatermark extractWatermark;

    @Resource
    private JNILinuxSo jniLinuxSo;

    //实现mysql数据库的导出  (SQL文件方式)
    public void exportSql() throws IOException {
        String tableName = "userinfo";
        WatermarkingConfiguration watermarkingConfiguration = null;
        try {
            watermarkingConfiguration = extractWatermark.text(tableName);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        Runtime runtime = Runtime.getRuntime();
        String command = getExportCommand(watermarkingConfiguration);
        System.out.println(command);
        //  这里其实是在命令窗口中执行的 command 命令行
        Process exec = runtime.exec(command);
        try {
            int i = exec.waitFor();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


    // 实现数据库的导入
    public static void  importSql()  {
        try {
            Properties properties = new Properties();
            Runtime runtime = Runtime.getRuntime();
            //把所执行的命令将以字符串数组的形式出现
            String cmdarray[] = getImportCommand(properties);//根据属性文件的配置获取数据库导入所需的命令，组成一个数组
            Process process = runtime.exec(cmdarray[0]);
            //执行了第一条命令以后已经登录到mysql了，所以之后就是利用mysql的命令窗口
            OutputStream os = process.getOutputStream();
            OutputStreamWriter writer = new OutputStreamWriter(os);
            //命令1和命令2要放在一起执行
            // 这里会执行后面的代码， 将命令输出到mysql的命令窗口，进行执行
            writer.write(cmdarray[1] + "\n" + cmdarray[2]);
            writer.flush();
            writer.close();
            os.close();
        } catch (Exception e) {
            log.error("数据库执行错误 ",e);
        }
    }


    //  得到 导出数据 的 命令行语句
    private  String getExportCommand(WatermarkingConfiguration watermarkingConfiguration) {

        StringBuffer command = new StringBuffer();
        String username = watermarkingConfiguration.getUSER() ;//用户名
        String password = watermarkingConfiguration.getPASSWORD();//用户密码
        String exportDatabaseName = watermarkingConfiguration.getDBNAME();//需要导出的数据库名
        String embedTableName = watermarkingConfiguration.getEMBEDTABLENAME();
        String host = watermarkingConfiguration.getHOST();//从哪个主机导出数据库，如果没有指定这个值，则默认取localhost
        String port = watermarkingConfiguration.getPORT();//使用的端口号
//        String username = "root" ;//用户名
//        String password = "sc.9102";//用户密码
//        String exportDatabaseName = "dsm";//需要导出的数据库名
//        String embedTableName = "dlp_datarisksit_assessment_question_bank";
//        String host = "10.26.18.61";//从哪个主机导出数据库，如果没有指定这个值，则默认取localhost
//        String port = "3306";//使用的端口号
//        String exportPath = "C:\\text\\user.sql";//导出路径
//        String MysqlPath = "E:\\mysql\\bin\\"; //  路径是mysql中 bin 文件 的位置
        String exportPath = "/user/user.sql";//导出路径
        String MysqlPath = "/usr/bin/"; //  路径是mysql中 bin 文件 的位置
        command.append(MysqlPath).append("mysqldump -u").append(username).append(" -p").append(password)//密码是用的小p，而端口是用的大P。
                .append(" -h").append(host).append(" -P").append(port).append(" ").append(exportDatabaseName).append(" ").append(embedTableName).append(" -r ").append(exportPath);

        return command.toString();
    }


    // 得到 导入 数据库的命令
    //  得到 导入数据 的 命令行语句
    private static String[] getImportCommand(Properties properties) {
        String username = "root";//用户名
        String password = "Wzx.1104";//密码
        String host = "10.26.18.58";//导入的目标数据库所在的主机
        String port = "3306";//使用的端口号
        String importDatabaseName = "WatermarkExtraction";//导入的目标数据库的名称
//        String importPath = "C:\\text\\user.sql";//导入的目标文件所在的位置
//        String MysqlPath = "E:\\mysql\\bin\\"; //  路径是mysql中 bin 文件 的位置
        String importPath = "/user/user.sql";//导入的目标文件所在的位置
        String MysqlPath = "/usr/bin/"; //  路径是mysql中 bin 文件 的位置

        if (new File(importPath).exists()){
            log.error("有文件");
        }else{
            log.error("没有文件");
        }
        //第一步，获取登录命令语句
        String loginCommand = new StringBuffer().append(MysqlPath).append("mysql -h").append(host).append(" -u").append(username).append(" -p").append(password)
                .append(" -P").append(port).toString();
        //第二步，获取切换数据库到目标数据库的命令语句
        String switchCommand = new StringBuffer().append("use ").append(importDatabaseName).toString();
        //第三步，获取导入的命令语句
        String importCommand = new StringBuffer(" source ").append(importPath).toString();
        //需要返回的命令语句数组

        String[] commands = new String[] {loginCommand, switchCommand, importCommand};
        log.error("数据库的导入语句1:   "+loginCommand);
        log.error("数据库的导入语句2:   "+switchCommand);
        log.error("数据库的导入语句3:   "+importCommand);
        log.error("数据库的导入是否正确:   "+commands);
        return commands;

    }
    /**
     *在目标库创建数据库
     * @Description
     * @author GeXiaoLong
     * @time 2023/2/13 11:46
     * @param
     * @return
     */
    public  void watermarkingDatabase() throws SQLException {
        log.error("数据库安装程序进来了吗?");
        Statement st = null;
        try {
            log.error("数据库安装程序运行进来了吗?");
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://10.26.18.58:3306/mysql?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai";
            String username = "root";
            String password = "Wzx.1104";
            Connection c = DriverManager.getConnection(url, username, password);
            st = c.createStatement();
            st.executeUpdate("CREATE DATABASE IF NOT EXISTS WatermarkExtraction");//创建数据库,有就跳过,没有就创建
        } catch (Exception e) {
            log.error("数据库添加程序运行失败,原因是: ",e);
        } finally {
            st.close();
        }
    }
    /**
     *mysql数据库水印提取
     * @Description
     * @author GeXiaoLong
     * @time 2023/2/13 20:38
     * @param
     * @return
     */
    public Integer mysqlWatermarkInformationExtraction() throws IOException, InterruptedException, SQLException {
        watermarkingDatabase();
        exportSql();
        Thread.sleep(2000);
        importSql();
        Thread.sleep(2000);
        Integer text = jniLinuxSo.text();
        return text;
    }

}
